package main

import (
	"fmt"
)

type MyError struct {
	code      string
	error_msg string
}

// &调用地址,  *调用地址中的值 这样才能对原函数进行改变
func (e *MyError) Error() string {
	return fmt.Sprintf("code:%s,error:%s", e.code, e.error_msg)
}
func (e *MyError) print() string {
	if e.code == "haha" {
		return "haha"
	}
	return "wuwu"
}

// 错误测试
func test(i int) (int, error) {
	if i < 0 {
		//return i, errors.New("")//errors只能是字符串,信息太少,更多时候会使用自定义类型
		return i, &MyError{"haha", "i<0"}
	}
	return i, &MyError{"wuwu", "i>=0"}
}

func main() {
	now, err := test(10)
	if err != nil {
		myErr, _ := err.(*MyError)
		if myErr.print() == "haha" {
			fmt.Println(myErr.print())
		}
		fmt.Println(err)
	} else {
		fmt.Println(now)
	}
	now, err = test(-100)
	if err != nil {
		myErr, _ := err.(*MyError)
		if myErr.print() == "haha" {
			fmt.Println(myErr.print())
		}
		fmt.Println(err)
	} else {
		fmt.Println(now)
	}

}
